Shell脚本实战06-MySQL数据库分库备份

1. 需求

实现MySQL分库备份的脚本

2. 实现过程

2.1. 批量建库脚本

基本的批量建库脚本如下,这里使用for循环在数据库服务器里批量创建数据库。

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
PATH="/usr/local/mysql/bin:$PATH" #<==定义mysql命令所在路径
MYUSER=root #<==定义数据库用户名
MYPASS=123456 #<==定义数据库用户密码
SOCKET=/tmp/mysql.sock #<==定义数据库sock文件
MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET" #<==定义登陆数据库的命令
for dbname in db1 db2 db3 db4 #<==要创建的数据库列表
do
$MYCMD -e "create database $dbname;" 2> /dev/null #<==创建数据库的命令
done

说明:不登陆数据库创建数据库的命令为:mysql -uroot -ppassword -S /data/3306/mysql.sock -e "create database db1;"

2.2. 分库备份数据库脚本

分库备份数据库(即每个库一个文件)的脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
PATH="/usr/local/mysql/bin:$PATH" #<==定义mysql命令所在路径
DBPATH="/data/backup"
MYUSER=root
MYPASS=123456
SOCKET=/tmp/mysql.sock
MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET" #<==定义登陆数据库的命令
MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET" #<==备份数据库的核心命令部分
[ ! -d "$DBPATH" ] && mkdir $DBPATH #<==创建备份路径
for dbname in `$MYCMD -e"show databases;"|sed '1,2d'|egrep -v "mysql|schema"`
#<==登陆数据库获取数据库里的所有数据库名
do
$MYDUMP $dbname | gzip > $DBPATH/${dbname}_$(date +%F).sql.gz
#<==对获取的数据库名循环备份
done

说明:备份数据库的命令为mysqldump -uuser -ppassword -S /tmp/mysql.sock db1 | gzip > /server/backup/db1_$(date +%F).sql.gz

2.3. 执行结果

执行结果如下:

1
2
3
4
5
# ll /server/backup/
-rw-r--r--. 1 root root 444 3月 18 22:36 db1_2018-03-18.sql.gz
-rw-r--r--. 1 root root 444 3月 18 22:36 db2_2018-03-18.sql.gz
-rw-r--r--. 1 root root 444 3月 18 22:36 db3_2018-03-18.sql.gz
-rw-r--r--. 1 root root 444 3月 18 22:36 db4_2018-03-18.sql.gz

0%